#!/usr/bin/env python
# -*- coding: utf-8 -*-

# @Author  : 张亦辰
# @Copyright (c) Copyright 2025 张亦辰，All rights reserved。
# @File    : main.py
# @Software: PyCharm
# @Time    : 2025/10/4 21:47

"""
程序说明:
猜数字游戏规则：
玩家需要根据程序提示，输入一个4位数整数，这4位数由1-9组成，且各位不重复。
程序随机生成四位数，这4位数由1-9组成，且各位不重复。
如果输入的数字与程序生成的随机数相同，玩家则猜对了数字，游戏结束。否则：
1、如果输入的数字与程序生成的随机数每一位相比，数字和位置都相同，程序会提示玩家输入的数字中为全，有几个这样的数字，就提示为几全；
2、如果输入的数字与程序生成的随机数每一位相比，有相同的数字，但位置不同，程序会提示玩家输入的数字中为中，有个相同的数字，就提示为几中；
3、如果输入的数字与程序生成的随机数每一位相比，没有相同的数字，程序会提示玩家输入的数字中为0；
玩家需要根据提示继续输入，直到猜对数字为止。
"""

import random


class GuessNumberGame:
    """
    猜数字游戏类
    规则：
    1. 程序随机生成一个4位数，由1-9组成，且各位不重复
    2. 玩家输入一个4位数，由1-9组成，且各位不重复
    3. 程序比较输入数字和随机数字，给出提示：
       - 数字和位置都相同：全
       - 数字相同但位置不同：中
       - 没有相同数字：0
    4. 直到玩家猜对为止
    """

    def __init__(self):
        """初始化游戏，生成随机数字"""
        # 是否包含0,如果包含0,则在生成所有可能的数字时,需要包含0
        self.contain_zero = '1'
        # 猜测次数
        self.guesses = 0
        # 目标数字
        self.target_number = self._generate_random_number()
        print("欢迎来到猜数字游戏！")
        # print(f"目标数字是：{self.target_number}")
        # print("请输入一个4位数，每位数字由0-9组成，且各位不重复。")

    def _generate_random_number(self):
        """生成一个4位的随机数字，每位由1-9组成且不重复"""
        # 如果包含0,则在生成所有可能的数字时,需要包含0
        stat = 0 if self.contain_zero == '' else 1

        digits = list(range(stat, 10))  # 创建1-9的数字列表
        random.shuffle(digits)  # 打乱顺序
        return ''.join(map(str, digits[:4]))  # 取前4个数字并转换为字符串

    def _validate_input(self, user_input):
        """验证用户输入是否合法"""
        # 检查是否为4位数
        if len(user_input) != 4:
            return False, "输入必须是4位数！"

        # 检查是否全为数字
        if not user_input.isdigit():
            return False, "输入必须全为数字！"

        # 检查是否包含0
        if self.contain_zero != '0' and '0' in user_input:
            return False, "输入不能包含0！"

        # 检查是否有重复数字
        if len(set(user_input)) != 4:
            return False, "输入的数字不能重复！"

        return True, ""

    def compare_numbers(self, user_input):
        """比较用户输入和目标数字，返回结果"""
        correct_digits = 0  # 全的数量
        wrong_position_digits = 0  # 中的数量

        # 检查数字和位置都相同的情况
        for i in range(4):
            if user_input[i] == self.target_number[i]:
                correct_digits += 1

        # 检查数字相同但位置不同的情况
        for digit in user_input:
            if digit in self.target_number and user_input.index(digit) != self.target_number.index(digit):
                wrong_position_digits += 1

        self.guesses += 1

        if correct_digits == 4:
            return True, f"恭喜你猜对了！总共用了{self.guesses}次。"
        elif correct_digits == 0 and wrong_position_digits == 0:
            return False, "0"
        else:
            # 为0时，不提示
            c_msg = "" if correct_digits == 0 else f"{correct_digits}全"
            w_msg = "" if wrong_position_digits == 0 else f"{wrong_position_digits}中"

        return False, c_msg + w_msg

    def set_contain_zero(self, contain_zero):
        """设置是否包含0"""
        self.contain_zero = contain_zero

    def start_game(self):
        """开始游戏循环"""
        zero = input("请确认是否包含0（0包含，1或 不输入 不包含）: ")
        if zero == "0":
            self.set_contain_zero("0")
        else:
            self.set_contain_zero("1")

        while True:
            user_input = input("请输入你猜测的4位数: ")

            # 验证输入
            is_valid, message = self._validate_input(user_input)
            if not is_valid:
                print(message)
                continue

            # 比较数字
            is_correct, result = self.compare_numbers(user_input)
            print(result)

            # 如果猜对了，结束游戏
            if is_correct:
                break
